package com.dufang.thread01Create;

/**
 * 第一种方式创建线程：extends Thread类
 * 1、定义一个类，继承Thread
 * 2、重写如方法。在run方法中设置线程任务（所谓的线程任务值得是此线程要干的具体的事儿，具体执行的代码）
 * 3、创建自定义线程类的对象
 * 4、调用Thread中的start方法，开启线程，jvm自动调用run方法
 *
 * 第二种方式创建线程：implements Runnable类
 * 1、创建类，实现Runnable接口
 * 2、重写run方法，设置线程任务
 * 3、利用Thread类中的构造方法：Thread(Runnable target),创建Thread对象（线程对象），将自定义的类当参数
 *    传递到Thread构造中->这一步是让我们自己定义的类成为一个真正的线程类对象
 *  4、调用Thread的start方法开启线程，jvm自动调用run方法。
 *
 *  第三种方式——匿名内部类创建多线程（实现Runnable接口的基础上完成的）
 *  1、new 接口/抽象类（）{
 *      重写方法
 *  }。重写的方法（）
 *
 *  2、接口名/类名 对象名=new 接口/抽象类（）{
 *      重写方法
 *  }
 *  对象名。重写方法（）；
 *
 *  两种方式的区别
 * extends Thread类：只支持单继承，有几成的局限性
 * 实现Runnable：没有继承的局限性，MyThread extends Fu implements Runnable
 */
public class MyTest {
    public static void main(String[] args) {
        //第一种创建线程对象
        DemoThread t1=new DemoThread();
        //调用start方法，开启线程，jvm自动调用run方法
        t1.start();

        //第二种创建线程
        DemoRunnable demoRunnable=new DemoRunnable();
        Thread t2=new Thread(demoRunnable);
        //调用Thread中的start方法，开启线程
        t2.start();
        //  t2.run();

    /*    t1.setPriority(1);
        t2.setPriority(2);*/

        //第三种方式 -实现匿名内部类 Thread(new Runnable),Thread(new Runnable,name)
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"...执行了"+i);
                }
            }
        },"匿名1").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"..执行了"+i);
                }
            }
        },"匿名2").start();



       /* for (int i = 0; i < 10; i++) {
            System.out.println("main线程。。。。执行了"+i);
        }*/

       /* DemoThread t1=new DemoThread();
        DemoThread t2=new DemoThread();

        t1.setName("线程1");
        t2.setName("线程2");

        t1.setPriority(1);
        t2.setPriority(2);

        t1.start();
        t2.start();*/
    }
}
